﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using grupo2DEWStudio7i.Persistencia.ADO;
using grupo2DEWStudio7i.Persistencia;
using grupo2DEWStudio7i.Dominio;

namespace grupo2DEWStudio7i.Pruebas
{
    [TestFixture]
    public class TestServicioDAO
    {
        private IServicioDAO servicioDAO = null;
        private int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void InicioPruebas()
        {
            servicioDAO = new Persistencia.ADO.ServicioDAO();
            foreach (Servicio servicio in servicioDAO.ListarTodos())
            servicioDAO.Eliminar(servicio);
            servicioDAO.Crear(new Servicio() { Descripcion = "Editar pistas", CostoXhora = 8 });
            servicioDAO.Crear(new Servicio() { Descripcion = "Quemado de DVD's", CostoXhora = 6 });
        }

        [Test]
        public void Test1CrearServicioDAO()
        {
            // 1. Clase a probar: ServicioDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Servicio servicioCrear = new Servicio();
            servicioCrear.Descripcion = "Servicio nro 1";
            servicioCrear.CostoXhora = 13;
            // 3. Declaramos la entidad que contendrá el resultado
            Servicio servicioCreado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                servicioCreado = servicioDAO.Crear(servicioCrear);
                codigoGenerado = servicioCreado.Codigo;
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(servicioCreado);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(servicioCreado.Codigo, 0);
            // Probamos que la descripcion registrado es igual al solicitado con la entidad
            Assert.AreEqual(servicioCreado.Descripcion, servicioCrear.Descripcion);
            // Probamos que el costo x hora registrado es igual a la solicitada con la entidad
            Assert.AreEqual(servicioCreado.CostoXhora, servicioCrear.CostoXhora);
        }

        [Test]
        public void Test2ObtenerServicioDAO()
        {
            // 1. Clase a probar: ServicioDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Definimos los datos para la prueba
            int codigo = codigoGenerado;
            // 3. Declaramos la entidad que contendrá el resultado
            Servicio servicioObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                servicioObtenido = servicioDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(servicioObtenido);
            Assert.AreEqual(servicioObtenido.Codigo, codigo);
            Assert.IsNotNullOrEmpty(servicioObtenido.Descripcion);
            Assert.IsNotNull(servicioObtenido.CostoXhora);
        }

        [Test]
        public void Test3ModificarServicioDAO()
        {
            // 1. Clase a probar: ServicioDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Servicio servicioModificar = servicioDAO.Obtener(codigoGenerado);
            servicioModificar.Descripcion = "Servicio nro1 modificado";
            servicioModificar.CostoXhora = 17;
            // 3. Declaramos la entidad que contendrá el resultado
            Servicio servicioModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                servicioModificado = servicioDAO.Modificar(servicioModificar);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(servicioModificado);
            // Probamos que el código generado sea igual al solicitado
            Assert.AreEqual(servicioModificado.Codigo, codigoGenerado);
            // Probamos que la descripcion registrada es igual a la solicitada con la entidad
            Assert.AreEqual(servicioModificado.Descripcion, servicioModificar.Descripcion);
            // Probamos que el costo x hora registrada es igual a la solicitada con la entidad
            Assert.AreEqual(servicioModificado.CostoXhora, servicioModificar.CostoXhora);
        }

        [Test]
        public void Test4EliminarServicioDAO()
        {
            // 1. Clase a probar: servicioDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Definimos la entidad que contendrá el resultado
            Servicio servicioExistente = servicioDAO.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                servicioDAO.Eliminar(servicioExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(servicioDAO.Obtener(codigoGenerado));
        }
        [Test]
        public void Test5Listartodos()
        {
            // 1. Clase a probar: servicioDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Servicio> serviciosEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                serviciosEncontrados = servicioDAO.ListarTodos();
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(serviciosEncontrados);
            // Probamos que la cantidad de locales encontrados sea 2
            Assert.AreEqual(serviciosEncontrados.Count, 2);
            // Probamos que cada servicio contenga la cadena de búsqueda en su descripcion
            foreach (Servicio servicioEncontrado in serviciosEncontrados)
            {
                Assert.IsNotNull(servicioEncontrado);
                Assert.IsInstanceOf(typeof(Servicio), servicioEncontrado);
            }
        }
        [Test]
        public void Test6ListarXBusqueda()
        {
            // 1. Clase a probar: servicioDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Definimos los datos para la prueba
            string _descripcion = "serv"; 
            // 3. Declaramos la entidad que contendrá el resultado
            ICollection<Servicio> serviciosEncontrados = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                serviciosEncontrados = servicioDAO.ListarxBusqueda(null, _descripcion, null);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(serviciosEncontrados);
            // Probamos que la cantidad de locales encontrados sea 2
            Assert.AreEqual(serviciosEncontrados.Count, 0);
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Servicio servicioEncontrado in serviciosEncontrados)
            {
                Assert.IsTrue(servicioEncontrado.Descripcion.Contains(_descripcion));
            }
        }
    }
}